home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / datelib.exe / CHECKDAT.C < prev    next >
C/C++ Source or Header  |  1992-03-27  |  7KB  |  223 lines

  1. static char checkdate_prog[] = "@(#)Testung auf gültiges Datum";
  2. static char checkdate_ver[]  = "@(#)ver 1.20/kr ; 14.05.91";
  3. /* checkdate        Funktion testet auf gültigen Datum-String
  4. **
  5. ** Autor            Klaus Rath
  6. **
  7. ** Deklaration
  8. **
  9. ** Übergabe         Die Funktion erwartet einen String in einem der folgenden
  10. **                  Formate :
  11. **                  tt.mm.[jj]jj     -- Deutsches Format       (format: 1,2)
  12. **                  mm/tt/[jj]jj     -- Amerikanisches Format  (format: 3,4)
  13. **                  [jj]jjmmtt       -- Datenbankformat DDB/4  (format: 5,6)
  14. **                  tt.mm. | mm/tt   -- Kurzformat deutsch/am. (format: 7,8)
  15. ** Rückgabe         int [format|FALSE] wobei z.Zt. 1 <= format <=8
  16. **
  17. ** Anmerkungen      Die Funktion berücksichtigt vollständig Schaltjahre - durch
  18. **                  Aufruf der Funktion 'int schalt_jahr(int jahr)', die dem-
  19. **                  entsprechend mit eingebunden werden muß.
  20. **                  Sollte kein Jahrhundert im Übergabestring angegeben worden
  21. **                  sein, ermittelt die Funktion das Default-Jahrhundert aus
  22. **                  der Systemzeit !
  23. **                  Entsprechendes gilt, falls auch kein Jahr vorhanden ist.
  24. **                  Der Bereich, in dem checkdate arbeiten kann, liegt
  25. **                  zwischen dem 01.01.0000 und dem 31.12.9999 !!!
  26. ** Änderungen       1.10 ; 13.04.91
  27. **                  Die Funktion gibt jetzt den Format-Typ des übergebenen
  28. **                  Datums-String zurück. Werte siehe datum.h !
  29. **                  1.20 ; 14.05.91
  30. **                  Neue Formate 7 und 8 eingebaut.
  31. */
  32.  
  33. #include <stdio.h>
  34. #include <string.h>
  35. #include <time.h>
  36. #ifdef __TURBOC__
  37. #define ANSI
  38. #define MSDOS
  39. #include <stdlib.h>
  40. #include <sys\types.h>
  41. #else
  42. #include <sys/types.h>
  43. #endif
  44. #include "datum.h"
  45.  
  46. #ifdef ANSI
  47. int checkdate(char *dstring)
  48. #else
  49. int checkdate(dstring)
  50. char *dstring;
  51. #endif
  52. {
  53.     char   tag_s[3];
  54.     char   monat_s[3];
  55.     char   jahr_s[3];
  56.     char   jh_s[3];
  57.     int    tag_z;
  58.     int    monat_z;
  59.     int    jahr_z;
  60.     int    jh_z;
  61.     int    laenge;
  62.     char   systemzeit_s[26];
  63.     time_t systemzeit;
  64.     int    jahreszahl;
  65.     int    format;
  66.  
  67.     /* Längenüberprüfung :
  68.     */
  69.     laenge = strlen(dstring);
  70.     if ( laenge == 5 || laenge == 6 || laenge == 8 || laenge == 10 )
  71.         ;
  72.     else
  73.         return(FALSE);
  74.  
  75.     /* Jahrhundert und Jahr aus der Systemzeit ermitteln und vorbelegen :
  76.     */
  77.     time(&systemzeit);
  78.     strcpy(systemzeit_s,ctime(&systemzeit));
  79.     jh_s[0]   = systemzeit_s[20];
  80.     jh_s[1]   = systemzeit_s[21];
  81.     jh_s[2]   = '\0';
  82.     jahr_s[0] = systemzeit_s[22];
  83.     jahr_s[1] = systemzeit_s[23];
  84.     jahr_s[2] = '\0';
  85.  
  86.     /* Format überprüfen und umkopieren :
  87.     */
  88.     if ( dstring[2] == '.' && dstring[5] == '.' ) {  /* deutsches Format */
  89.         tag_s[0]   = dstring[0];
  90.         tag_s[1]   = dstring[1];
  91.         tag_s[2]   = '\0';
  92.         monat_s[0] = dstring[3];
  93.         monat_s[1] = dstring[4];
  94.         monat_s[2] = '\0';
  95.         if ( laenge == 10 ) {
  96.             jh_s[0] = dstring[6];
  97.             jh_s[1] = dstring[7];
  98.             jh_s[2] = '\0';
  99.             jahr_s[0] = dstring[8];
  100.             jahr_s[1] = dstring[9];
  101.             jahr_s[2] = '\0';
  102.             format    = DE_LANG;
  103.         }
  104.         else if ( laenge == 8 ) {
  105.             jahr_s[0] = dstring[6];
  106.             jahr_s[1] = dstring[7];
  107.             jahr_s[2] = '\0';
  108.             format    = DE_KURZ;
  109.         }
  110.         else if ( laenge == 6 ) {
  111.             format    = DE_AKTJAHR;
  112.         }
  113.         else
  114.             return(FALSE);
  115.     } /* ENDE: Deutsches Format */
  116.     else if ( dstring[2] == '/'
  117.               && ( dstring[5] == '/' || laenge == 5 ) ) { /* amerik.Format */
  118.         tag_s[0]   = dstring[3];
  119.         tag_s[1]   = dstring[4];
  120.         tag_s[2]   = '\0';
  121.         monat_s[0] = dstring[0];
  122.         monat_s[1] = dstring[1];
  123.         monat_s[2] = '\0';
  124.         if ( laenge == 10 ) {
  125.             jh_s[0] = dstring[6];
  126.             jh_s[1] = dstring[7];
  127.             jh_s[2] = '\0';
  128.             jahr_s[0] = dstring[8];
  129.             jahr_s[1] = dstring[9];
  130.             jahr_s[2] = '\0';
  131.             format    = AM_LANG;
  132.         }
  133.         else if ( laenge == 8 ) {
  134.             jahr_s[0] = dstring[6];
  135.             jahr_s[1] = dstring[7];
  136.             jahr_s[2] = '\0';
  137.             format    = AM_KURZ;
  138.         }
  139.         else if ( laenge == 5 ) {
  140.             format    = AM_AKTJAHR;
  141.         }
  142.         else
  143.             return(FALSE);
  144.     } /* ENDE: Amerikanisches Format */
  145.     else if ( atol(dstring) != (long)NULL ) {       /* Datenbank-Format */
  146.         if ( laenge == 8 ) {
  147.             jh_s[0]    = dstring[0];
  148.             jh_s[1]    = dstring[1];
  149.             jh_s[2]    = '\0';
  150.             jahr_s[0]  = dstring[2];
  151.             jahr_s[1]  = dstring[3];
  152.             jahr_s[2]  = '\0';
  153.             tag_s[0]   = dstring[6];
  154.             tag_s[1]   = dstring[7];
  155.             tag_s[2]   = '\0';
  156.             monat_s[0] = dstring[4];
  157.             monat_s[1] = dstring[5];
  158.             monat_s[2] = '\0';
  159.             format     = DB_LANG;
  160.         }
  161.         else if ( laenge == 6 ) {
  162.             jahr_s[0]  = dstring[0];
  163.             jahr_s[1]  = dstring[1];
  164.             jahr_s[2]  = '\0';
  165.             tag_s[0]   = dstring[4];
  166.             tag_s[1]   = dstring[5];
  167.             tag_s[2]   = '\0';
  168.             monat_s[0] = dstring[2];
  169.             monat_s[1] = dstring[3];
  170.             monat_s[2] = '\0';
  171.             format     = DB_KURZ;
  172.         }
  173.         else
  174.             return(FALSE);
  175.     } /* ENDE: Datenbankformat */
  176.     else
  177.         return(FALSE);
  178.     /* ENDE:if(Formatprüfung und Kopierung) */
  179.  
  180.     /* Konvertierung :
  181.     */
  182.     if ( ( (tag_z   = atoi(tag_s))   == 0 )
  183.          ||
  184.          ( (monat_z = atoi(monat_s)) == 0 )
  185.        )
  186.         return(FALSE);
  187.     jh_z   = atoi(jh_s);
  188.     jahr_z = atoi(jahr_s);
  189.  
  190.     if ( monat_z > 12 || monat_z < 0 || tag_z < 0 || jahr_z < 0 || jh_z < 0 )
  191.         return(FALSE);
  192.  
  193.     switch ( monat_z ) {
  194.         case 1  :
  195.         case 3  :
  196.         case 5  :
  197.         case 7  :
  198.         case 8  :
  199.         case 10 :
  200.         case 12 :  if ( tag_z > 31 )
  201.                        return(FALSE);
  202.                    break;
  203.         case  4 :
  204.         case  6 :
  205.         case  9 :
  206.         case 11 :  if ( tag_z > 30 )
  207.                        return(FALSE);
  208.                    break;
  209.         case  2 :  jahreszahl = jh_z*100 + jahr_z;
  210.                    if ( schalt_jahr(jahreszahl) == TRUE ) {
  211.                        if ( tag_z > 29 )
  212.                            return(FALSE);
  213.                    }
  214.                    else
  215.                        if ( tag_z > 28 )
  216.                            return(FALSE);
  217.                    break;
  218.     } /* ENDE: switch */
  219.  
  220.     return(format);
  221. } /* ENDE: checkdate() */
  222.  
  223.